{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "iNx2ze3Cfuh5"
      },
      "source": [
        "<div dir=\"rtl\" align=\"center\">\n",
        "<font face=\"XB Zar\" size=5>\n",
        "    <font face=\"IranNastaliq\" size=5>\n",
        "      به نام خدا\n",
        "    </font>\n",
        "    <br>\n",
        "    <font size=3>\n",
        "      دانشگاه صنعتی شریف - دانشکده مهندسی کامپیوتر\n",
        "    </font>\n",
        "    <br>\n",
        "    <font color=blue size=5>\n",
        "      مقدمه‌ای بر یادگیری ماشین\n",
        "    </font>\n",
        "    <br>\n",
        "    <hr/>\n",
        "    <font color=red size=6>\n",
        "      فصل هفتم: Encoder, Decoder\n",
        "    </font>\n",
        "    <br>\n",
        "       نویسندگان:‌ علیرضا دهقانپور فراشاه، مهدی سلمانی\n",
        "    <hr>\n",
        "<br>\n",
        "  <div align=\"right\">\n",
        "  <font color=\"red\" size=5>فهرست مطالب</font>\n",
        "\t<ul>\n",
        "    <li>\n",
        "        <a href='#intro'>\n",
        "        مقدمه\n",
        "    </a>\n",
        "\t\t</li>\n",
        "\t\t<li>\n",
        "      <a href=\"#model\">\n",
        "       آشنایی با مدل\n",
        "      </a>\n",
        "    </li>\n",
        "    <li>\n",
        "      <a href=\"#training\">\n",
        "       آموزش مدل\n",
        "      </a>\n",
        "    </li>\n",
        "    <li>\n",
        "      <a href=\"#inference\">\n",
        "       نحوه خروجی گرفتن با داده تست\n",
        "      </a>\n",
        "    </li>\n",
        "    </li>\n",
        "    </div>\n",
        "</font>\n",
        "</div>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "sIGyifOmnOYc"
      },
      "source": [
        "\n",
        "  <div dir=rtl id=\"intro\">\n",
        "  <font face=\"XB Zar\" size=4>\n",
        "      <font color=\"red\" size=5>\n",
        "        مقدمه\n",
        "      </font>\n",
        "<img src=\"https://static.packt-cdn.com/products/9781788624336/graphics/69abba8d-f902-43a9-8701-684941d1baf2.png\" width=\"500\">\n",
        "\n",
        "</font>\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "id": "OFc72WjwOv1s"
      },
      "outputs": [],
      "source": [
        "from random import randint\n",
        "from numpy import array\n",
        "from numpy import argmax\n",
        "import keras.backend as K\n",
        "from tensorflow.keras import models\n",
        "from numpy import array_equal\n",
        "import numpy as np\n",
        "from tensorflow.keras.models import Sequential, Model\n",
        "from tensorflow.keras.layers import LSTM, Bidirectional\n",
        "from tensorflow.keras.layers import Dense, Flatten\n",
        "from tensorflow.keras import Input\n",
        "from tensorflow.keras.layers import TimeDistributed\n",
        "from tensorflow.keras.layers import RepeatVector\n",
        "from tensorflow.keras.callbacks import EarlyStopping\n",
        "from tensorflow.keras.utils import plot_model\n",
        "from tensorflow.keras.models import load_model\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "from tensorflow.keras.layers import Lambda\n",
        "from tensorflow.keras import backend as K"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "\n",
        "n_timesteps_in =   10\n",
        "\n",
        "n_features = 10   \n",
        "\n",
        "train_size= 5000\n",
        "test_size = 100  \n",
        "\n",
        "\n",
        "LSTMoutputDimension = 16"
      ],
      "metadata": {
        "id": "Ceat3IVaPblD"
      },
      "execution_count": 18,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "BmZv9X3O0cxg"
      },
      "source": [
        "\n",
        "  <div dir=rtl id=\"model\">\n",
        "  <font face=\"XB Zar\" size=4>\n",
        "      <font color=\"red\" size=5>\n",
        "        آشنایی با مدل\n",
        "      </font>\n",
        "      <hr />\n",
        "        در این بخش میخواهیم ستون \n",
        "  </font>\n",
        "  </div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 19,
      "metadata": {
        "id": "d5cbzOzxego6"
      },
      "outputs": [],
      "source": [
        "# TRAINING WITH TEACHER FORCING\n",
        "# Define an input sequence and process it.\n",
        "encoder_inputs= Input(shape=(n_timesteps_in, n_features))\n",
        "encoder_lstm=LSTM(LSTMoutputDimension, return_state=True)\n",
        "LSTM_outputs, state_h, state_c = encoder_lstm(encoder_inputs)\n",
        "\n",
        "\n",
        "# We discard `LSTM_outputs` and only keep the other states.\n",
        "encoder_states = [state_h, state_c]\n",
        "\n",
        "\n",
        "\n",
        "decoder_inputs = Input(shape=(None, n_features), name='decoder_inputs')\n",
        "decoder_lstm = LSTM(LSTMoutputDimension, return_sequences=True, return_state=True, name='decoder_lstm')\n",
        "\n",
        "# Set up the decoder, using `context vector` as initial state.\n",
        "decoder_outputs, _, _ = decoder_lstm(decoder_inputs,\n",
        "                                     initial_state=encoder_states)\n",
        "\n",
        "#complete the decoder model by adding a Dense layer with Softmax activation function \n",
        "#for prediction of the next output\n",
        "#Dense layer will output one-hot encoded representation as we did for input\n",
        "#Therefore, we will use n_features number of neurons\n",
        "decoder_dense = Dense(n_features, activation='softmax', name='decoder_dense')\n",
        "decoder_outputs = decoder_dense(decoder_outputs)\n",
        "\n",
        "# put together\n",
        "model_encoder_training = Model([encoder_inputs, decoder_inputs], decoder_outputs, name='model_encoder_training')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 20,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 796
        },
        "execution": {
          "iopub.execute_input": "2022-09-08T17:23:58.094178Z",
          "iopub.status.busy": "2022-09-08T17:23:58.093871Z",
          "iopub.status.idle": "2022-09-08T17:23:58.223769Z",
          "shell.execute_reply": "2022-09-08T17:23:58.222728Z",
          "shell.execute_reply.started": "2022-09-08T17:23:58.094152Z"
        },
        "id": "FWaKYE6Zego-",
        "outputId": "7ae64551-af6d-4476-def5-0100d4806651"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Model: \"model_encoder_training\"\n",
            "__________________________________________________________________________________________________\n",
            " Layer (type)                   Output Shape         Param #     Connected to                     \n",
            "==================================================================================================\n",
            " input_5 (InputLayer)           [(None, 10, 10)]     0           []                               \n",
            "                                                                                                  \n",
            " decoder_inputs (InputLayer)    [(None, None, 10)]   0           []                               \n",
            "                                                                                                  \n",
            " lstm_2 (LSTM)                  [(None, 16),         1728        ['input_5[0][0]']                \n",
            "                                 (None, 16),                                                      \n",
            "                                 (None, 16)]                                                      \n",
            "                                                                                                  \n",
            " decoder_lstm (LSTM)            [(None, None, 16),   1728        ['decoder_inputs[0][0]',         \n",
            "                                 (None, 16),                      'lstm_2[0][1]',                 \n",
            "                                 (None, 16)]                      'lstm_2[0][2]']                 \n",
            "                                                                                                  \n",
            " decoder_dense (Dense)          (None, None, 10)     170         ['decoder_lstm[0][0]']           \n",
            "                                                                                                  \n",
            "==================================================================================================\n",
            "Total params: 3,626\n",
            "Trainable params: 3,626\n",
            "Non-trainable params: 0\n",
            "__________________________________________________________________________________________________\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAABKMAAAGVCAYAAAAi4TIGAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdeVhU1/0/8PcVGGaGXUChIC4gCoKJUfMV1MekaROXuuACRE2rSXwAYxUlCe5xr0sK1ETi18TSVvtFQK0ajbE1iRob5GeiBqsRDUYRN0TZF9nO7w/LxJFFBmbmzsD79Tzzh+eee8/nnnNm5vDx3juSEEKAiIiIiIiIiIjI8NI6yR0BERERERERERF1HExGERERERERERGR0TAZRURERERERERERsNkFBERERERERERGY2l3AHIZcqUKXKHQERE1CEtWLAAQUFBcodBRERERDLpsFdG7d69G7m5uXKHQU+Rm5uL3bt3yx2G2eH8Jn3ifCJ92r17N27cuCF3GEREREQkow57ZRQAzJ8/H6GhoXKHQc1ITU1FWFgY0tLS5A7FrEiSxPlNesP5RPokSZLcIRARERGRzDrslVFERERERERERGR8TEYREREREREREZHRMBlFRERERERERERGw2QUEREREREREREZDZNRRERERERERERkNExGGchnn30GBwcHfPrpp3KH0iZr1qyBJEkNXgEBAXKHppP2Mh5ERERERERE5o7JKAMRQsgdAj2G40FERERERERkGpiMMpAxY8agqKgIY8eOlTsUVFRUIDg4uNX779ixA0IIrdd//vMfPUZoeO1pPIiIiIiIiIjMGZNRHcD27duRl5cndxj0XxwPIiIiIiIi6siYjDKAkydPwsvLC5Ik4cMPPwQAJCYmwsbGBmq1Gvv378eoUaNgb28PT09PJCcna/bdvHkzlEolunTpgsjISLi7u0OpVCI4OBgZGRmaenPnzoVCoYCbm5um7K233oKNjQ0kSUJ+fj4AIDo6GjExMcjOzoYkSfDx8TFSL5gOcxiPzz//HPb29li7dq0xuoSIiIiIiIhINkxGGcCwYcPwzTffaJXNnj0b8+fPR0VFBezs7JCSkoLs7Gz06tULs2bNQnV1NYBHSY0ZM2agvLwc8+bNw7Vr13DmzBnU1NTg17/+NW7cuAHgUZIkNDRUq40tW7Zg5cqVWmUJCQkYO3YsvL29IYTAjz/+qPP5LFq0CE5OTlAoFOjZsycmTJiA06dP63wcuZjDeNTW1gIA6urqDNIHRERERERERKaCySgZBAcHw97e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mYno6Gh4eXlhxowZmjo+Pj548OAB9u3bh+rqaty7dw/Xr19vcKzOnTvj1q1buHbtGkpKSppNeFRXV+Pu3bs4duyYJhnl5eUFADh69CgqKytx5cqVJp+nFBUVhYcPH+LgwYMYO3as1jalUomZM2ciOTkZiYmJKC4uRm1tLXJzc3H79m1du6jNlEolYmJisHfvXuzcuRPFxcU4f/48oqKi4O7ujoiICE3dtva1ocfz8OHDsLe3x9q1a/XfUUREREREREQyYTKqBTIyMhAQEIB//etfAAA/Pz+sW7cOiYmJmtve+vfvj6tXr+Ljjz9GTEwMAGDkyJG4cuWK5jiVlZUIDAyESqXC8OHD4evri6+++grW1taaOrNnz8aLL76IV199FX369MHq1auhUqkAAEFBQbhx4waARwmiLl26wN/fH6NHj8b27dvh4+OD7OxsFBUVaT2/SaFQwM3NDQcOHIBarQYABAYGIjY2Flu2bIG7uzuWLFmCF154AQAwbNgwTTsA8D//8z8YMGAAZs6cCUvLhhfTJSQkYP78+diwYQOcnZ3h7u6O6OhoFBQUYOPGjYiLiwMA+Pr6YufOnXoZk+a89957WLduHVatWgUXFxeMGDECPXr00ErGAa3v6wcPHgAw7HjWt0FERERERETU3kii/mfSOhhJkpCSkoLQ0FCjtBcZGYm0tDTcv3/fKO3p25gxY/Dhhx+iZ8+eRm03NTUVYWFhMLVpaurjaez5Te0b5xPpE+cTERERUYeXxiujjKi2tlbuEFrs8dv+MjMzoVQqjZ6IMnXmNJ5EREREREREpoIPMKdGxcbGIioqCkIIzJw5Ezt27JA7JCIiIiIiIiJqB3hllBEsXrwYSUlJKCoqQs+ePbF79265Q3oqtVqNvn374le/+hVWrFgBf39/uUMyGeY4nkRERERERESmgskoI1i3bh0ePnwIIQR++uknTJ48We6QnmrNmjWora1FTk5Og1/Q6+jMcTyJiIiIiIiITAWTUUREREREREREZDRMRhERERERERERkdEwGUVEREREREREREbDZBQRERERERERERmNpdwByCk9PV3uEOgp6scoNTVV5kjMD+c36RPnExERERER6YskhBByByEHSZLkDoGIiKhDSklJQWhoqNxhEBEREZE80jrslVEdNAdH1C5IksQ/ZomIiIiIiMwUnxlFRERERERERERGw2QUEREREREREREZDZNRRERERERERERkNExGERERERERERGR0TAZRURERERERERERsNkFBERERERERERGQ2TUUREREREREREZDRMRhERERERERERkdEwGUVEREREREREREbDZBQRERERERERERkNk1FERERERERERGQ0TEYREREREREREZHRMBlFRERERERERERGw2QUEREREREREREZDZNRRERERERERERkNExGERERERERERGR0TAZRURERERERERERsNkFBERERERERERGQ2TUUREREREREREZDRMRhERERERERERkdEwGUVEREREREREREbDZBQRERERERERERkNk1FERERERERERGQ0TEYREREREREREZHRMBlFRERERERERERGw2QUEREREREREREZDZNRRERERERERERkNExGERERERERERGR0TAZRURERERERERERsNkFBERERERERERGQ2TUUREREREREREZDRMRhERERERERERkdEwGUVEREREREREREYjCSGE3EEQETUlIiICWVlZWmVnzpxBz5494eTkpCmzsLDAX//6V3h6eho7RCIiIiIiImq5NEu5IyAiak7Xrl2xbdu2BuWZmZla/+7VqxcTUURERERERGaAt+kRkUmbOnXqU+soFArMmDHD8MEQERERERFRmzEZRUQmrW/fvujXrx8kSWqyTlVVFcLCwowYFREREREREbUWk1FEZPJ++9vfwsLCotFtkiThmWeega+vr5GjIiIiIiIiotZgMoqITN6rr76K2traRrdZWFjgd7/7nZEjIiIiIiIiotZiMoqITF63bt0wZMgQdOrU8COrtrYWoaGhMkRFRERERERErcFkFBGZhddee63Bc6M6deqEYcOGwcPDQ6aoiIiIiIiISFdMRhGRWZgyZUqDMkmS8Nvf/laGaIiIiIiIiKi1mIwiIrPg4uKCl156SetB5pIkISQkRMaoiIiIiIiISFdMRhGR2Zg+fTqEEAAePbj8lVdegbOzs8xRERERERERkS6YjCIiszFx4kQoFAoAgBAC06dPlzkiIiIiIiIi0hWTUURkNmxsbPCb3/wGAKBQKDB27FiZIyIiIiIiIiJdMRlFRGZl2rRpAICQkBDY2NjIHA0RERERERHpShL1D2D5r9TUVISFhckVDxEREZHZmzx5MtLS0gxy7ClTpmD3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\n",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "execution_count": 20
        }
      ],
      "source": [
        "model_encoder_training.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n",
        "model_encoder_training.summary()\n",
        "plot_model(model_encoder_training, show_shapes=True)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "7u-9szEQ1UST"
      },
      "source": [
        "\n",
        "  <div dir=rtl id=\"preprocessing\">\n",
        "    <font face=\"XB Zar\" size=4>\n",
        "      <font color=\"red\" size=5>آماده سازی دیتاست</font>\n",
        "      <hr />  ‍\n",
        "  </div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 21,
      "metadata": {
        "id": "q0br4xpCOv19"
      },
      "outputs": [],
      "source": [
        "\n",
        "\n",
        "# generate a sequence of random integers\n",
        "def generate_sequence(length, n_unique):\n",
        "\treturn [randint(1, n_unique-1) for _ in range(length)]\n",
        "\n",
        "# one hot encode sequence\n",
        "def one_hot_encode(sequence, n_unique):\n",
        "\tencoding = list()\n",
        "\tfor value in sequence:\n",
        "\t\tvector = [0 for _ in range(n_unique)]\n",
        "\t\tvector[value] = 1\n",
        "\t\tencoding.append(vector)\n",
        "\treturn array(encoding)\n",
        "\n",
        "# decode a one hot encoded string\n",
        "def one_hot_decode(encoded_seq):\n",
        "  return [argmax(vector) for vector in encoded_seq]\n",
        "\n",
        "  # prepare encoder data for the Encoder-Decoder training\n",
        "def get_encoder_triple(time_steps,vocabulary_size,verbose= False):\n",
        "  # generate random sequence\n",
        "  sequence_in = generate_sequence(time_steps, vocabulary_size)\n",
        "\n",
        "  encoder_in = sequence_in.copy()\n",
        "\n",
        "  decoder_out = sequence_in[::-1]\n",
        "  decoder_in = decoder_out.copy()\n",
        "  decoder_in.insert(0,0)\n",
        "  decoder_in.pop()\n",
        "\n",
        "  # one hot encode\n",
        "  X_encoder_in = one_hot_encode(encoder_in, vocabulary_size)\n",
        "  X_decoder_in = one_hot_encode(decoder_in, vocabulary_size)\n",
        "  y_decoder_out = one_hot_encode(decoder_out, vocabulary_size)\n",
        "  # reshape as 3D\n",
        "  X_encoder_in = X_encoder_in.reshape((1, X_encoder_in.shape[0], X_encoder_in.shape[1]))\n",
        "  X_decoder_in = X_decoder_in.reshape((1, X_decoder_in.shape[0], X_decoder_in.shape[1]))\n",
        "  y_decoder_out = y_decoder_out.reshape((1, y_decoder_out.shape[0], y_decoder_out.shape[1]))\n",
        "\n",
        "  if(verbose):\n",
        "    print('\\nSample X_encoder_in X_decoder_in and y_decoder_out')\n",
        "    print('\\nIn raw format:')\n",
        "    print('X_encoder_in=%s, X_decoder_in=%s, y_decoder_out=%s' % \n",
        "          (one_hot_decode(X_encoder_in[0]), one_hot_decode(X_decoder_in[0]), \n",
        "           one_hot_decode(y_decoder_out[0])))\n",
        "    print('\\nIn one_hot_encoded format:')\n",
        "    print('X_encoder_in=%s' % (X_encoder_in[0]))\n",
        "    print('X_decoder_in=%s' % (X_decoder_in[0]))\n",
        "    print('y_decoder_out=%s' % (y_decoder_out[0]))\n",
        "  return [array(X_encoder_in), array(X_decoder_in), array(y_decoder_out)]\n",
        "\n",
        "\n",
        "def create_encoder_dataset(train_size, test_size, time_steps,vocabulary_size, verbose= False):\n",
        "\n",
        "  X_encoder_in = list()\n",
        "  X_decoder_in = list()\n",
        "  y_decoder_out = list()\n",
        "\n",
        "  for _ in range(train_size):\n",
        "    triple=get_encoder_triple(time_steps,vocabulary_size) \n",
        "    X_encoder_in.append(triple[0])\n",
        "    X_decoder_in.append(triple[1])\n",
        "    y_decoder_out.append(triple[2])\n",
        "\n",
        "  X_encoder_in= array(X_encoder_in).squeeze()\n",
        "  X_decoder_in= array(X_decoder_in).squeeze()\n",
        "  y_decoder_out= array(y_decoder_out).squeeze()\n",
        "  if(verbose):\n",
        "    print('\\nGenerated sequence datasets as follows')\n",
        "    print('X_encoder_in.shape: ', X_encoder_in.shape)\n",
        "    print('X_decoder_in.shape: ', X_decoder_in.shape)\n",
        "    print('y_decoder_out.shape: ', y_decoder_out.shape)\n",
        "    print('Sample sequences in raw format:')\n",
        "    \n",
        "    print('X_encoder_in: \\n', one_hot_decode(X_encoder_in[0]))\n",
        "    print('X_decoder_in: \\n', one_hot_decode(X_decoder_in[0]))\n",
        "    print('y_decoder_out: \\n',one_hot_decode(y_decoder_out[0]))\n",
        "\n",
        "    print('Sample sequences in one-hot encoded format:')\n",
        "    print('X_encoder_in: \\n', X_encoder_in[0])\n",
        "    print('X_decoder_in: \\n', X_decoder_in[0])\n",
        "    print('y_decoder_out: \\n', y_decoder_out[0])\n",
        "\n",
        "  return X_encoder_in,X_decoder_in, y_decoder_out"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 22,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "execution": {
          "iopub.execute_input": "2022-09-08T17:23:58.225234Z",
          "iopub.status.busy": "2022-09-08T17:23:58.224941Z",
          "iopub.status.idle": "2022-09-08T17:23:58.274266Z",
          "shell.execute_reply": "2022-09-08T17:23:58.272846Z",
          "shell.execute_reply.started": "2022-09-08T17:23:58.225206Z"
        },
        "id": "Vxei2ek5egpB",
        "outputId": "c54a1188-108d-4f70-a566-442aceda714d"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\n",
            "Generated sequence datasets as follows\n",
            "X_encoder_in.shape:  (5000, 10, 10)\n",
            "X_decoder_in.shape:  (5000, 10, 10)\n",
            "y_decoder_out.shape:  (5000, 10, 10)\n",
            "Sample sequences in raw format:\n",
            "X_encoder_in: \n",
            " [9, 3, 5, 3, 4, 3, 6, 4, 7, 2]\n",
            "X_decoder_in: \n",
            " [0, 2, 7, 4, 6, 3, 4, 3, 5, 3]\n",
            "y_decoder_out: \n",
            " [2, 7, 4, 6, 3, 4, 3, 5, 3, 9]\n",
            "Sample sequences in one-hot encoded format:\n",
            "X_encoder_in: \n",
            " [[0 0 0 0 0 0 0 0 0 1]\n",
            " [0 0 0 1 0 0 0 0 0 0]\n",
            " [0 0 0 0 0 1 0 0 0 0]\n",
            " [0 0 0 1 0 0 0 0 0 0]\n",
            " [0 0 0 0 1 0 0 0 0 0]\n",
            " [0 0 0 1 0 0 0 0 0 0]\n",
            " [0 0 0 0 0 0 1 0 0 0]\n",
            " [0 0 0 0 1 0 0 0 0 0]\n",
            " [0 0 0 0 0 0 0 1 0 0]\n",
            " [0 0 1 0 0 0 0 0 0 0]]\n",
            "X_decoder_in: \n",
            " [[1 0 0 0 0 0 0 0 0 0]\n",
            " [0 0 1 0 0 0 0 0 0 0]\n",
            " [0 0 0 0 0 0 0 1 0 0]\n",
            " [0 0 0 0 1 0 0 0 0 0]\n",
            " [0 0 0 0 0 0 1 0 0 0]\n",
            " [0 0 0 1 0 0 0 0 0 0]\n",
            " [0 0 0 0 1 0 0 0 0 0]\n",
            " [0 0 0 1 0 0 0 0 0 0]\n",
            " [0 0 0 0 0 1 0 0 0 0]\n",
            " [0 0 0 1 0 0 0 0 0 0]]\n",
            "y_decoder_out: \n",
            " [[0 0 1 0 0 0 0 0 0 0]\n",
            " [0 0 0 0 0 0 0 1 0 0]\n",
            " [0 0 0 0 1 0 0 0 0 0]\n",
            " [0 0 0 0 0 0 1 0 0 0]\n",
            " [0 0 0 1 0 0 0 0 0 0]\n",
            " [0 0 0 0 1 0 0 0 0 0]\n",
            " [0 0 0 1 0 0 0 0 0 0]\n",
            " [0 0 0 0 0 1 0 0 0 0]\n",
            " [0 0 0 1 0 0 0 0 0 0]\n",
            " [0 0 0 0 0 0 0 0 0 1]]\n"
          ]
        }
      ],
      "source": [
        "\n",
        "encoder_input_data, decoder_input_data, decoder_predicted_data=\\\n",
        "create_encoder_dataset(train_size, test_size, n_timesteps_in,n_features , verbose=True)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "\n",
        "  <div dir=rtl id=\"training\">\n",
        "    <font face=\"XB Zar\" size=4>\n",
        "      <font color=\"red\" size=5>آموزش مدل</font>\n",
        "      <hr />  ‍\n",
        "  </div>"
      ],
      "metadata": {
        "id": "rGFFzm99T43e"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 23,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "execution": {
          "iopub.execute_input": "2022-09-08T17:23:58.275887Z",
          "iopub.status.busy": "2022-09-08T17:23:58.275573Z",
          "iopub.status.idle": "2022-09-08T17:23:58.309198Z",
          "shell.execute_reply": "2022-09-08T17:23:58.308143Z",
          "shell.execute_reply.started": "2022-09-08T17:23:58.275853Z"
        },
        "id": "-rUt-7j7egpD",
        "outputId": "1b6f3cb1-8494-46e0-fcca-a0bcd4b1c7ba"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Epoch 1/30\n",
            "125/125 [==============================] - 4s 12ms/step - loss: 2.2124 - accuracy: 0.1508 - val_loss: 2.0834 - val_accuracy: 0.2274\n",
            "Epoch 2/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 1.9967 - accuracy: 0.2632 - val_loss: 1.9074 - val_accuracy: 0.3051\n",
            "Epoch 3/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 1.7990 - accuracy: 0.3564 - val_loss: 1.6927 - val_accuracy: 0.4099\n",
            "Epoch 4/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 1.5982 - accuracy: 0.4473 - val_loss: 1.5164 - val_accuracy: 0.4794\n",
            "Epoch 5/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 1.4402 - accuracy: 0.5088 - val_loss: 1.3683 - val_accuracy: 0.5392\n",
            "Epoch 6/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 1.3048 - accuracy: 0.5576 - val_loss: 1.2640 - val_accuracy: 0.5710\n",
            "Epoch 7/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 1.1892 - accuracy: 0.5953 - val_loss: 1.1400 - val_accuracy: 0.6199\n",
            "Epoch 8/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 1.0908 - accuracy: 0.6331 - val_loss: 1.0422 - val_accuracy: 0.6554\n",
            "Epoch 9/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 1.0172 - accuracy: 0.6542 - val_loss: 0.9785 - val_accuracy: 0.6756\n",
            "Epoch 10/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.9576 - accuracy: 0.6735 - val_loss: 0.9096 - val_accuracy: 0.7035\n",
            "Epoch 11/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.8968 - accuracy: 0.6948 - val_loss: 0.8708 - val_accuracy: 0.7038\n",
            "Epoch 12/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.8543 - accuracy: 0.7093 - val_loss: 0.8321 - val_accuracy: 0.7227\n",
            "Epoch 13/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.8170 - accuracy: 0.7206 - val_loss: 0.7923 - val_accuracy: 0.7350\n",
            "Epoch 14/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.7711 - accuracy: 0.7387 - val_loss: 0.7692 - val_accuracy: 0.7419\n",
            "Epoch 15/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.7456 - accuracy: 0.7452 - val_loss: 0.7313 - val_accuracy: 0.7498\n",
            "Epoch 16/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.7120 - accuracy: 0.7575 - val_loss: 0.6957 - val_accuracy: 0.7628\n",
            "Epoch 17/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.6850 - accuracy: 0.7657 - val_loss: 0.6692 - val_accuracy: 0.7717\n",
            "Epoch 18/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.6637 - accuracy: 0.7744 - val_loss: 0.6431 - val_accuracy: 0.7818\n",
            "Epoch 19/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.6374 - accuracy: 0.7826 - val_loss: 0.6183 - val_accuracy: 0.7910\n",
            "Epoch 20/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.6199 - accuracy: 0.7880 - val_loss: 0.6251 - val_accuracy: 0.7880\n",
            "Epoch 21/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.6066 - accuracy: 0.7923 - val_loss: 0.5859 - val_accuracy: 0.8050\n",
            "Epoch 22/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.5818 - accuracy: 0.8019 - val_loss: 0.5446 - val_accuracy: 0.8221\n",
            "Epoch 23/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.5550 - accuracy: 0.8151 - val_loss: 0.5788 - val_accuracy: 0.8071\n",
            "Epoch 24/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.5607 - accuracy: 0.8087 - val_loss: 0.6015 - val_accuracy: 0.7924\n",
            "Epoch 25/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.5433 - accuracy: 0.8155 - val_loss: 0.5157 - val_accuracy: 0.8314\n",
            "Epoch 26/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.5239 - accuracy: 0.8228 - val_loss: 0.5322 - val_accuracy: 0.8223\n",
            "Epoch 27/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.5065 - accuracy: 0.8289 - val_loss: 0.4981 - val_accuracy: 0.8335\n",
            "Epoch 28/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.4888 - accuracy: 0.8371 - val_loss: 0.5065 - val_accuracy: 0.8313\n",
            "Epoch 29/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.4833 - accuracy: 0.8370 - val_loss: 0.4917 - val_accuracy: 0.8340\n",
            "Epoch 30/30\n",
            "125/125 [==============================] - 1s 6ms/step - loss: 0.4796 - accuracy: 0.8385 - val_loss: 0.4637 - val_accuracy: 0.8441\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<keras.callbacks.History at 0x7fdc29b70d50>"
            ]
          },
          "metadata": {},
          "execution_count": 23
        }
      ],
      "source": [
        "model_encoder_training.fit([encoder_input_data, decoder_input_data], decoder_predicted_data,\n",
        "          batch_size=32,\n",
        "          epochs=30,\n",
        "          validation_split=0.2)"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "\n",
        "  <div dir=rtl id=\"inference\">\n",
        "    <font face=\"XB Zar\" size=4>\n",
        "      <font color=\"red\" size=5>نحوه خروجی گرفتن روی داده تست</font>\n",
        "      <hr />  ‍\n",
        "  </div>"
      ],
      "metadata": {
        "id": "SNzvcU7eUFKJ"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 24,
      "metadata": {
        "execution": {
          "iopub.execute_input": "2022-09-08T17:23:59.694902Z",
          "iopub.status.busy": "2022-09-08T17:23:59.694562Z",
          "iopub.status.idle": "2022-09-08T17:23:59.770833Z",
          "shell.execute_reply": "2022-09-08T17:23:59.769590Z",
          "shell.execute_reply.started": "2022-09-08T17:23:59.694874Z"
        },
        "id": "m_BKQ1yuegpP",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 174
        },
        "outputId": "48219b44-281c-48eb-a4df-355dc598dee6"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAACdCAIAAAB+eaCNAAAABmJLR0QA/wD/AP+gvaeTAAARPUlEQVR4nO3de1ST9R8H8O+zC9ueyQaTuakwLiMdEJa3ooWXLNMsUWTAUhQ9yQHMlCQhLxUntbxDkeCpzK6HjVsq1klPKmoqakpqApNQBEUEuSoXGbDfH8/v7EzQcXu+G+Dn9df2PM++3893vHnu2wiDwYAAoBvD2gWAwQmCBbCAYAEsIFgAC5bpkzNnzuzcudNapYABbdWqVS+99JLx6SNrrNLS0vT0dIuXZH05OTk5OTnWrmIAS09PLy0tNZ3C6rxQWlqaperpLwIDA9FTOXC6EATRYQrsYwEsIFgACwgWwAKCBbCAYAEsIFgACwgWwAKCBbCAYAEsIFgACwgWwAKCBbCAYAEsIFgAi94E6/fffxcKhVlZWbRX0xcbN24kHvXss8/S2H5OTo6HhweDwSAIQiKRbNy4kcbGzcvIyHBzc6MGJZVKQ0JCLNZ1rz3mfqwuPZ2fGPPx8cnPz585c+ahQ4d0Op2dnZ3Fug4ICAgICHB3d7937155ebnF+u2L3qyx3nzzzbq6utmzZ9NeTQdNTU1KpbL7y//0008GE//++y++2nDr6dj7m369j7Vnz56KigprV2EdA33sPQ7WX3/9JZPJCIL46quvEEJJSUl8Pp8kyf3797/xxhsCgcDR0TElJYVa+Msvv+RyucOGDYuIiBg+fDiXy1UqlWfPnqXmrlixwsbGRiqVUk/fffddPp9PEMS9e/cQQlFRUdHR0UVFRQRBuLu70zNcWvW3sZ88edLT01MoFHK5XG9v70OHDiGEli5dSu2cyeXy3NxchNCSJUtIkhQKhQcOHEAItbW1ffzxxzKZjMfjjRkzRqvVIoS2bt1KkqStrW1FRUV0dPTIkSN1Ol3P3h3TbQfVqKEr1G3ziYmJ1NN169YhhI4cOVJXV1dRUTFp0iQ+n9/S0kLNDQ8P5/P5eXl5zc3NV69enThxoq2tbUlJCTV3wYIFEonE2PK2bdsQQpWVldTTgIAAuVzeZT2UDRs2ODo62tnZsdlsFxeXOXPmnDt3rpuvValUKpWqO0vOmDEDIVRTU0M9teTY5XK5UCg0U1taWlpcXFx1dXVVVZWPj8/QoUONTTGZzNu3bxuXnD9//oEDB6jHH3zwAYfDSU9Pr6mpWbt2LYPBOH/+vHFoK1euTExMnDdvXn5+vpmuEUJardZ0Cm2bQqVSKRAIxGKxWq1uaGgoKSkxzmKxWB4eHhwOx9PTMykp6f79+3v37qWrX6PQ0NADBw6UlpY+ePAgJSWlpKRkypQpV69epb2jzqw+dopKpfrkk0/s7e1FIpGfn19VVVVlZSVCKDIysq2tzdhvfX39+fPnZ82ahRBqbm5OSkry9/cPCAiws7Nbv349m802rXDz5s3Lly/PyMhQKBQ9Kob+fSwbGxuEkF6vf+zcCRMmkCRZUFBAe79OTk5jx44dMmSIjY2Nj4/P3r17m5qadu3aRXtHZlhr7J2x2WyEUFtbG0Jo2rRpo0aN+u6776hVi0ajUavVTCYTIaTT6RobG43nZXg8nlQqpaVCK+y8czgc6j8JK29vbyaTee3aNdwd9QjWsf/2229Tp04Vi8UcDicmJsY4nSCIiIiI69evHzlyBCH0448/vvPOO9SshoYGhND69euNJ/9u3rzZ2NjY92IsHSy9Xl9bW+vo6Ii7o/b29vb2dg6Hg7uj7sMx9hMnTsTHxyOESkpK/P39pVLp2bNn6+rqtmzZYrrY4sWLuVzut99+q9PpBAKBs7MzNV0sFiOE4uPjTXePzpw50/fCenOCtC+ys7MNBoOPj8//u2exnrTh6KkZM2ZQx0EUag/U9EPfVodj7BcuXODz+QihK1eu6PX6ZcuWubm5oU6fILW3tw8ODtZoNLa2tmFhYcbpTk5OXC73n3/+6WMZnVlijdXe3l5TU9Pa2nr58uWoqCiZTLZ48WJqlru7e3V19b59+/R6fWVl5c2bN01fKBKJysrKiouL79+/3+Xf4Pbt2xqNpra2Vq/XnzlzZunSpTKZLDIyEtOgugnf2PV6/d27d7Ozs6lgyWQyhNCff/7Z3NxcWFhoPK9hFBkZ+fDhw4MHD5qe2eZyuUuWLElJSUlKSqqvr29ra7t169adO3doGLnpOrA7pxsSExOpsy8kSfr5+e3atYskSYTQM888U1RU9PXXXwsEAoSQs7PztWvXDAZDeHg4m80eOXIki8USCARz584tKioytlZVVfXKK69wuVxXV9f33ntv9erV1DtOHZNfvHjR2dmZx+P5+vqWl5ebLyw6Oloul/P5fBaL5ejoGBYWVlZWZv4lRt053ZCTk+Pl5cVgMBBCUql006ZNFht7cnKyXC5/0l8wMzOTajA2NlYkEtnZ2QUGBlJnGeVyufHshsFgGDt27Jo1azqM6+HDh7GxsTKZjMViicXigICAq1evbtmyhcfjIYScnJw6XM94LNTpdENvzmP1SHh4uEgkordN2nX/PFaP9Lexz5o16/r16zha7hwsS2wKqYPep5PVx27cjF6+fJlaO1qm3359rdCooKCAeDK1Wm3tAvuv2NjYwsLCa9euLVmyZMOGDRbrF2+w1q5du3fv3rq6OldX175885ZCoTCzHtZoNDTWTBe6xt5HJEkqFIrXXnstLi7O09PTYv0SBpObq1JTU4ODgw1P3+1W8P1YfUQQhFarDQoKMk4ZGJtCMOBAsAAWECyABQQLYAHBAlhAsAAWECyABQQLYAHBAlhAsAAWECyABQQLYAHBAlg85sMU1KX+pwr1m3JP4cDxeSRYTk5OKpXKWqVYkfGTM2b8/fffCKEJEybgL2fgUalUTk5OplOIp/Duq96hbjZKTU21diEDA+xjASwgWAALCBbAAoIFsIBgASwgWAALCBbAAoIFsIBgASwgWAALCBbAAoIFsIBgASwgWAALCBbAAoIFsIBgASwgWAALCBbAAoIFsIBgASwgWAALCBbAAoIFsIBgASwgWAALCBbAAoIFsIBgASwgWAALCBbAAoIFsIBgASzgG/2e6Pvvv09ISDD+WnhlZSVCSCwWU0+ZTGZUVNTixYutVV4/B8F6Ip1Op1AozCyQn59vfoGnGWwKn2j06NHe3t4EQXSeRRCEt7c3pMoMCJY5ixYtYjKZnaezWKzQ0FDL1zOAwKbQnLKyMkdHx85vEUEQJSUljo6OVqlqQIA1ljkjRoxQKpUMxiPvEoPBUCqVkCrzIFhdWLhwYYfdLIIgFi1aZK16BgrYFHahurpaIpG0trYapzCZzLt37w4dOtSKVfV/sMbqgkgkmj59Oov1/9+GYTKZ06dPh1R1CYLVtZCQkPb2duqxwWBYuHChdesZEGBT2LWGhgYHB4fm5maEEIfDuXfv3pAhQ6xdVH8Ha6yu8fl8Pz8/NpvNYrHmzp0LqeoOCFa3LFiwoLW1ta2tbf78+dauZWB4zA9h9s6tW7dOnz5NV2v9TVtbG5fLNRgMDx48GMS/LEfn+TkDTbRaLT0FAevRarV05YG2NRbFMHgPBaZOnYoQys7OtnId2Dz2cnuv0RysQczBwcHaJQwkEKzuovcfetCDo0KABQQLYAHBAlhAsAAWECyABQQLYAHBAlhAsAAWECyABQQLYAHBAlhAsAAWFg3W9u3bhw0bRhDE7t27Ldmv0aeffurp6SkQCDgcjru7e0xMzIMHD2hsPyMjw83NjSAIgiCkUmlISMiTlrx06ZJarXZ1deVwOA4ODs8999zGjRupWWq1mjDr4MGDph199NFHj+1i586dBEEwGAyFQnHixAkah9ktdN3YRd3o1+VihYWFCKHk5GS6+u2RKVOm7Nq1q6qqqr6+XqvVstnsmTNndvO1KpVKpVJ1Z0m5XC4UCs0scPnyZZIkV65ceePGjaamJp1OFxMT8+qrr1Jzg4ODDx8+XFtbq9fr79y5gxDy8/NraWlpaGioqKgICwvLysoydoQQkkqlLS0tHbpobW11dnZGCBmb7RKi9Ua//rgpbGpqUiqVOFoeMmRIeHi4SCSytbUNCgry9/f/448/SktLcfRlxvbt2+3s7BISElxcXLhc7qhRozZs2MDj8ai5BEG8/PLLQqHQ+GFGgiDYbDZJkmKxePz48aZNjR8/vry8fN++fR26yMjIGDlypAXG8iT9MVh79uypqKjA0fLBgwdNvz2GunevsbERR19mVFVV1dXVVVdXG6fY2NhkZWVRj1NSUkiSfNJrw8PD33rrLePTZcuWIYSSk5M7LLZz587o6Gg6i+4hKwfr+PHjL7zwAkmSAoHA29u7vr4+KioqOjq6qKiIIAh3d/eEhAQ+n89gMMaPHy+RSNhsNp/PHzdu3KRJk5ycnLhcrp2dXUxMTO96v337No/Hc3V1pXdQXZo4cWJDQ8O0adNOnTrVx6amTZvm4eFx7NgxnU5nnHjq1KnGxsbXX3+9j433hTWD1dDQ4Ofnp1KpqqurCwsLR40a1dLSkpCQMHv2bLlcbjAY/vvvv6ioqNWrVxsMhuTk5Bs3bpSXl0+ePDk3N3fNmjW5ubnV1dWhoaHbtm27dOlST3tvbGw8evRoWFiYjY0NjtGZERMTM2HChEuXLvn6+np5eW3dutV07dVTERERCCHT46EdO3asWrWKhkL7wJrBKi4urq+v9/Ly4nK5EokkIyPDzH3lnp6eJEkOHTr07bffRgjJZDIHBweSJKkjr4KCgp72/tlnnw0fPtx4LGZJPB7v9OnTX3zxhUKhyMvLi42N9fDwOH78eO9aCw0N5fP5P/zwQ1NTE0Lo+vXr58+ft/rnH60ZLDc3t2HDhoWEhMTFxRUXF3fzVdQKxvj1L2w2GyGk1+t71HVmZmZqauqhQ4dsbW179EK6sNnsFStW5Ofn5+TkzJ07t6KiIjAwsKamphdNCYXC+fPn19TUaDQahFB8fPyyZcssvxruwJrB4vF4R48e9fX13bRpk5ubm1qtpv7ncNNoNJs3b87OznZxcbFAd+a9+OKLv/76a2RkZGVl5bFjx3rXCLULv3v37tra2rS0NGrjaF1W3nn38vLKysoqKyuLjY3VarXbt2/H3WNiYuLPP/989OjRESNG4O7L1IkTJ+Lj46nHAQEBpl+4hRCivsGm18enzz//vI+Pz7lz58LDwwMDA+3t7ftYbd9ZM1hlZWV5eXkIIbFY/Pnnn48bN456ionBYIiNjb1y5cq+ffss/8UeFy5c4PP51OOHDx92GCl1TDdmzJhet0+ttNLT099///0+lEkbKwcrIiKioKCgpaUlNzf35s2bPj4+CCGRSFRWVlZcXHz//v2e7jyZkZeXt3Xr1m+++YbNZpteIcG9mtTr9Xfv3s3OzjYGCyHk7++fmppaW1tbV1e3f//+Dz/8cM6cOX0JVlBQkIODg7+/v5ubGx1V9xldp/C7c0lnx44dEokEIcTn8+fNm1dcXKxUKu3t7ZlM5ogRI9atW9fa2mowGC5evOjs7Mzj8Xx9fdesWUOdLXRxcTl58uTmzZuFQiFCSCKR/PLLLxqNhmrQ3t4+JSXFfO9Xrlx57Duwbdu27gywO5d0MjMzqcssj5WZmUktdvjw4eDgYLlczuFwbGxsRo8eHRcX19zcbNpUfX395MmTRSIRQojBYLi7u2/atKlzRw4ODsuXL6cmxsTEnD59mnq8fv16qVRKvdbT0/PkyZNdDhDRekmHti9eS01NDQ4Opqu1figwMBAhlJaWZu1CcCEIQqvVBgUF0dJaf7ykAwaBwROsgoICM7eaqNVqaxf4dBk8XwqiUCgG8YZ4wBk8ayzQr0CwABYQLIAFBAtgAcECWECwABYQLIAFBAtgAcECWECwABYQLIAFBAtgAcECWECwABY03zYziH/L79atW2hQD5BeNAcrODiY3gb7m0E/QLrAj40DLGAfC2ABwQJYQLAAFhAsgMX/ALmZmCHPR3KuAAAAAElFTkSuQmCC\n",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "execution_count": 24
        }
      ],
      "source": [
        "encoder_model = Model(encoder_inputs, encoder_states)\n",
        "plot_model(encoder_model)"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "decoder_state_input_h = Input(shape=(LSTMoutputDimension,))\n",
        "decoder_state_input_c = Input(shape=(LSTMoutputDimension,))\n",
        "decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c]\n",
        "\n",
        "decoder_outputs, state_h, state_c = decoder_lstm(\n",
        "    decoder_inputs, initial_state=decoder_states_inputs)\n",
        "decoder_states = [state_h, state_c]\n",
        "decoder_outputs = decoder_dense(decoder_outputs)\n",
        "decoder_model = Model(\n",
        "    [decoder_inputs] + decoder_states_inputs,\n",
        "    [decoder_outputs] + decoder_states)\n",
        "plot_model(decoder_model)"
      ],
      "metadata": {
        "id": "bCS3RIlkQ3va",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 272
        },
        "outputId": "ad3a28fb-72ee-426f-e9a3-5a4d92fea21d"
      },
      "execution_count": 25,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqsAAAD/CAYAAADWm585AAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3deVxU9d4H8M+wzTAom+KKguCCa+7XTFtM6tZNU0HBNLJSMW+Jyy3c8nLbFFHRck/tXjURUG9m9+mmVmqWWhaBqZArioi4gKyyfp8/fJjHCUGQmTln8PN+vfiD4cw5Hw7nd/z445yDRkQERERERETqE2+jdAIiIiIioqqwrBIRERGRarGsEhEREZFqsawSERERkWrZ/fGFQ4cOYcmSJUpkISIzmj59Oh5++GGzrHvkyJFmWS+Rmj388MOYPn26Wda9ZMkSHDp0yCzrJlKz+Pj4Sq9Vmlm9ePEitm3bZpFAZN0OHz6Mw4cPKx2DamDbtm24ePGiWdeflpZmtvU/KNLS0nj+tRKHDx82a5k8dOgQz68mwvOTdaju/FdpZrXC3Zot0Z0qZtN4rKifRqMx+zamTZuGUaNGmX079VlcXByCgoI4pqyAJX6b0K9fPx4LJqDRaHh+sgIV57+74TWrRERERKRaLKtEREREpFosq0RERESkWiyrRERERKRaLKtEREREpFosq0RERESkWiyrRERERKRaLKtEREREpFosq0RERESkWiyrRERERKRaLKtEREREpFosq0RERESkWiyrRERERKRaLKtEREREpFpmKavjx49Hw4YNodFo8Ouvv5pjE1aR53/+53/g4uKCXbt2WWybanb48GF07NgRNjY20Gg0aNq0Kd577z2lYxnZvn07fHx8oNFooNFo0KxZM4wdO1bpWPVOfRobJSUl+OCDD9C2bVs4ODjA1dUVXbp0wfnz582+bY4pulN9GVePP/644Xj540eDBg3Mum2OKXWyM8dK161bh8GDB2P06NHmWH2tKZVHRCy6PbXr168fTp48iT//+c/46quvkJKSAldXV6VjGQkICEBAQADatm2La9euISMjQ+lI9VJ9GhtBQUE4ceIEPv30U/Tq1QtXr17FpEmTkJeXZ/Ztc0zRnerTuKrKgAEDzLp+jil14mUAZvSXv/wFN2/exJAhQ5SOgsLCQvTv31/pGKrD/aKM+jI2tm7dis8++wzx8fH405/+BDs7OzRv3hw7d+5Ely5dTJzUOnBMKae+jCudToecnByIiNFHaGgo3nrrLRMnVT+OKTOWVY1GY65V3xe1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f/11w9feeust+eGHHwyfz507V5o1a2ZYX6dOneS7776r8fctwqcBEJlJnEakDg8FJKIHzsiRIwEA8fHxCichS+DPu+Y0Gg1iY2MxatQopaMQ1SfxvAyAiIiIiFSLZZWIyESSk5ONHnNV1UdwcLDSUYmIrIad0gGIiOoLPz+/Ov25VSIiqowzq0RERESkWiyrRERERKRaLKtEREREpFosq0RERESkWiyrRERERKRaLKtEREREpFosq0RERESkWiyrRERERKRaLKtEREREpFosq0RERESkWiyrRERERKRaLKtEREREpFosq0RERESkWiyrRERERKRadkoHICLrk5aWhri4OKVjkAWkpaUBAH/eRKQYllUiqrXDhw8jKChI6RhkQfx5E5FSNCIiSocgIqLai4uLQ1BQEHgaJ6J6LJ7XrBIRERGRarGsEhEREZFqsawSERERkWqxrBIRERGRarGsEhEREZFqsawSERERkWqxrBIRERGRarGsEhEREZFqsawSERERkWqxrBIRERGRarGsEhEREZFqsawSERERkWqxrBIRERGRarGsEhEREZFqsawSERERkWqxrBIRERGRarGsEhEREZFqsawSERERkWqxrBIRERGRarGsEhEREZFqsawSERERkWqxrBIRERGRarGsEhEREZFqsawSERERkWqxrBIRERGRarGsEhEREZFqsawSERERkWqxrBIRERGRarGsEhEREZFqsawSERERkWqxrBIRERGRarGsEhEREZFqsawSERERkWrZKR2AiIju7cqVK/jnP/9p9FpSUhIAIDIy0uh1Nzc3TJw40VLRiIjMSiMionQIIiKqXmlpKZo2bYqbN2/Czu7/5xlEBBqNxvB5UVERJkyYgLVr1yoRk4jI1OJ5GQARkRWws7NDcHAwbGxsUFRUZPgoLi42+hwAXnjhBYXTEhGZDssqEZGVGD16NEpKSqpdxsPDAwMHDrRQIiIi82NZJSKyEo888ghatGhR5dcdHBwQEhICW1tbC6YiIjIvllUiIiuh0WgwduxY2Nvb3/XrxcXFGD16tIVTERGZF8sqEZEVqe5SAC8vL/Tq1cvCiYiIzItllYjIinTv3h3t2rWr9LqDgwPGjRtn+UBERGbGskpEZGVCQkIqXQpQXFyMoKAghRIREZkPyyoRkZUZPXo0SktLDZ9rNBp069YNHTt2VDAV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IPPmzRMA4unpKYmJiSIiUlRUJOHh4dK6dWuxs7MTDw8PCQgIkOPHjxvWtXz5cunatavodDrR6XTSo0cPWbFihYiIlJeXS1RUlLRr107s7e3Fzc1Nhg8fLikpKSbPExkZKY6OjoZHKm3atKnW+9IUOVasWCF6vV4ASLt27eTMmTOydu1acXZ2FgDi5eUlv//+u5w/f1769+8vbm5uYmtrKy1atJA5c+ZIaWlpjff9vdT2aQCff/65dOvWTfR6vTg4OIiNjY0AMNz537dvX3nnnXfk+vXrld5rLfuETwMgMqk4jYiIQj2ZiKxEXFwcgoKCwNMF/dHIkSMBAPHx8QonUQ+OFyKTiudlAERERESkWiyrRER1kJycbPSYo6o+goODlY5KRGSV7JQOQERkzfz8/PjrXiIiM+LMKhERERGpFssqEREREakWyyoRERERqRbLKhERERGpFssqEREREakWyyoRERERqRbLKhERERGpFssqEREREakWyyoRERERqRbLKhERERGpFssqEREREakWyyoRERERqRbLKhERERGpFssqEREREamWndIBiMh6aDQapSOQSvHYICJzYVklonvq378/YmNjlY5BREQPII2IiNIhiIiIiIjuIp7XrBIRERGRarGsEhEREZFqsawSERERkWrZAYhXOgQRERER0V0c/l9PrEfeZIQyyAAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "execution_count": 25
        }
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "metadata": {
        "id": "q8c_8eOb0ZU5"
      },
      "outputs": [],
      "source": [
        "def decode_sequence(input_seq):\n",
        "    # Encode the input as state vectors.\n",
        "    states_value = encoder_model.predict(input_seq)\n",
        "\n",
        "    # Generate empty target sequence of length 1.\n",
        "    target_seq = np.zeros((1, 1, n_features))\n",
        "    # Populate the first character of target sequence with the start character.\n",
        "    target_seq[0, 0, 0] = 1\n",
        "\n",
        "    # Sampling loop for a batch of sequences\n",
        "    # (to simplify, here we assume a batch of size 1).\n",
        "    stop_condition = False\n",
        "    decoded_seq = list()\n",
        "    while not stop_condition:\n",
        "\n",
        "        # in a loop\n",
        "        # decode the input to a token/output prediction + required states for context vector\n",
        "        output_tokens, h, c = decoder_model.predict(\n",
        "            [target_seq] + states_value)\n",
        "\n",
        "        # convert the token/output prediction to a token/output\n",
        "        sampled_token_index = np.argmax(output_tokens[0, -1, :])\n",
        "        sampled_digit = sampled_token_index\n",
        "        # add the predicted token/output to output sequence\n",
        "        decoded_seq.append(sampled_digit)\n",
        "        \n",
        "\n",
        "        # Exit condition: either hit max length\n",
        "        # or find stop character.\n",
        "        if (len(decoded_seq) == n_timesteps_in):\n",
        "            stop_condition = True\n",
        "\n",
        "        # Update the input target sequence (of length 1) \n",
        "        # with the predicted token/output \n",
        "        target_seq = np.zeros((1, 1, n_features))\n",
        "        target_seq[0, 0, sampled_token_index] = 1.\n",
        "\n",
        "        # Update input states (context vector) \n",
        "        # with the ouputed states\n",
        "        states_value = [h, c]\n",
        "\n",
        "        # loop back.....\n",
        "        \n",
        "    # when loop exists return the output sequence\n",
        "    return decoded_seq"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "print('Input \\t\\t\\t  Expected  \\t   Predicted \\t\\tT/F')\n",
        "correct =0 \n",
        "sampleNo =  10\n",
        "for sample in range(0,sampleNo):\n",
        "  predicted= decode_sequence(encoder_input_data[sample].reshape(1,n_timesteps_in,n_features))\n",
        "  if (one_hot_decode(decoder_predicted_data[sample])== predicted):\n",
        "    correct+=1\n",
        "  print( one_hot_decode(encoder_input_data[sample]), '\\t\\t', \n",
        "        one_hot_decode(decoder_predicted_data[sample]),'\\t', predicted,\n",
        "        '\\t\\t',one_hot_decode(decoder_predicted_data[sample])== predicted)\n",
        "print('Accuracy: ', correct/sampleNo)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 252
        },
        "id": "-e4Sy3YBVUU2",
        "outputId": "28512557-32fb-4d36-febd-459698a41198"
      },
      "execution_count": 56,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Input \t\t\t  Expected  \t   Predicted \t\tT/F\n"
          ]
        },
        {
          "output_type": "error",
          "ename": "ValueError",
          "evalue": "ignored",
          "traceback": [
            "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
            "\u001b[0;32m<ipython-input-56-b093fb4864aa>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0msampleNo\u001b[0m \u001b[0;34m=\u001b[0m  \u001b[0;36m10\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0msample\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0msampleNo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m   \u001b[0mpredicted\u001b[0m\u001b[0;34m=\u001b[0m \u001b[0mdecode_sequence\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mencoder_input_data\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0msample\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mn_timesteps_in\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mn_features\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      6\u001b[0m   \u001b[0;32mif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mone_hot_decode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdecoder_predicted_data\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0msample\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m==\u001b[0m \u001b[0mpredicted\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      7\u001b[0m     \u001b[0mcorrect\u001b[0m\u001b[0;34m+=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;31mValueError\u001b[0m: cannot reshape array of size 490 into shape (1,10,10)"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from tqdm import tqdm\n",
        "result = []\n",
        "for ts in tqdm(range(4, 50, 5)):\n",
        "    encoder_inputs= Input(shape=(ts, n_features))\n",
        "    encoder_lstm=LSTM(LSTMoutputDimension, return_state=True)\n",
        "    LSTM_outputs, state_h, state_c = encoder_lstm(encoder_inputs)\n",
        "    encoder_states = [state_h, state_c]\n",
        "    decoder_inputs = Input(shape=(None, n_features), name='decoder_inputs')\n",
        "    decoder_lstm = LSTM(LSTMoutputDimension, return_sequences=True, return_state=True, name='decoder_lstm')\n",
        "    decoder_outputs, _, _ = decoder_lstm(decoder_inputs,\n",
        "                                initial_state=encoder_states)\n",
        "    decoder_dense = Dense(n_features, activation='softmax', name='decoder_dense')\n",
        "    decoder_outputs = decoder_dense(decoder_outputs)\n",
        "    model_encoder_training = Model([encoder_inputs, decoder_inputs], decoder_outputs, name='model_encoder_training')\n",
        "    model_encoder_training.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n",
        "    encoder_input_data, decoder_input_data, decoder_predicted_data=\\\n",
        "    create_encoder_dataset(train_size, test_size, ts,n_features)\n",
        "    history = model_encoder_training.fit([encoder_input_data, decoder_input_data], decoder_predicted_data, \n",
        "          verbose=0,\n",
        "          batch_size=32,\n",
        "          epochs=20,\n",
        "          validation_split=0.2)\n",
        "    result.append(history.history['accuracy'][-1])\n",
        "\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "NbQao9hQjsSb",
        "outputId": "eef36490-7081-48ad-831f-160f1b6ea63f"
      },
      "execution_count": 33,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 10/10 [03:28<00:00, 20.87s/it]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import seaborn as sns\n",
        "sns.set()"
      ],
      "metadata": {
        "id": "Ds4-sV1yovuw"
      },
      "execution_count": 35,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "plt.plot(range(4, 50, 5), result)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 285
        },
        "id": "1OxIRWUZrj39",
        "outputId": "1845e983-5714-480a-f158-bc5b54c54db3"
      },
      "execution_count": 55,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7fdbdd011790>]"
            ]
          },
          "metadata": {},
          "execution_count": 55
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "x = range(4, 50, 5)\n",
        "poly = np.polyfit(x, result, deg=3)\n",
        "fig, ax = plt.subplots()\n",
        "ax.plot(result, label='data')\n",
        "ax.plot(np.polyval(poly, x), label='fit')\n",
        "ax.legend()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 285
        },
        "id": "pskpZ_9rqYEp",
        "outputId": "7021c99d-a8c8-4073-a044-281ccaf012a0"
      },
      "execution_count": 54,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.legend.Legend at 0x7fdc11adb5d0>"
            ]
          },
          "metadata": {},
          "execution_count": 54
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from scipy.interpolate import make_interp_spline, BSpline\n",
        "\n",
        "# 300 represents number of points to make between T.min and T.max\n",
        "xnew = np.linspace(4, 49, 300) \n",
        "\n",
        "spl = make_interp_spline(range(4, 50, 5), result, k=9)  # type: BSpline\n",
        "power_smooth = spl(xnew)\n",
        "\n",
        "plt.plot(xnew, power_smooth)\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 271
        },
        "id": "k4ibzibNpYLh",
        "outputId": "14355706-8e16-4ec9-ca15-d2206daa8344"
      },
      "execution_count": 44,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ]
    }
  ],
  "metadata": {
    "colab": {
      "collapsed_sections": [],
      "provenance": []
    },
    "gpuClass": "standard",
    "kernelspec": {
      "display_name": "Python 3 (ipykernel)",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.10.1"
    },
    "accelerator": "GPU"
  },
  "nbformat": 4,
  "nbformat_minor": 0
}